package com.hecore.lagou.speak.component;

import com.hecore.lagou.speak.entity.SpeakBean;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

/**
 * @Author: hecore
 * @Date: 2020/10/18 19:10
 * @Description:
 * 同样我们需要思考传入参数和输出参数
 *      输入不需要变, LongWriteable和Text 偏移量+文本
 *      输出呢? 自定义Bean
 */

public class SpeakMapper extends Mapper<LongWritable, Text,Text, SpeakBean> {

    SpeakBean v = new SpeakBean();
    Text k = new Text();

    /**
     * 切割成立数组。
     *
     * \n 换行
     * \t 的作用是跳格，即跳到下一个“制表位置”（也有说是TAB位置），在我们所用的系统中一个“制表区”占8列。“下一制表位置”从第9列开始。
     *
     * @param key
     * @param value
     * @param context
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    protected void map(LongWritable key, Text value, Context context)
            throws IOException, InterruptedException {
        // 1 获取⼀⾏
        String line = value.toString();
        // 2 切割字段 按照制表符
        String[] fields = line.split("\t");
        // 3 封装对象
        // 取出设备id
        String deviceId = fields[1];
        // 取出⾃有和第三⽅时⻓数据
        long selfDuration = Long.parseLong(fields[fields.length - 3]);
        long thirdPartDuration = Long.parseLong(fields[fields.length - 2]);
        k.set(deviceId);
        v.set(selfDuration, thirdPartDuration,deviceId);
        // 4 写出
        context.write(k, v);
    }

}

